#ifndef __TLV_H
#define __TLV_H
#include <stdint.h>
#include <string.h>
#include <stdlib.h>

#define  TLV_Delimiter  0x0f

// 注意大小端问题
// 小端：高位存放在高地址，低位存放在低地址
typedef struct _tlv_head
{
	uint8_t   Delimiter;    // TLV 界定符
	uint8_t   Length;       // TLV 数据部分的长度
	uint8_t   Tag;          // TLV 数据部分的类型
} __attribute__((packed)) tlv_head_t;

typedef struct _tlv
{
	tlv_head_t head;         // TLV 报文头
	uint8_t value[];         // TLV 数据部分 + CRC校验码
} __attribute__((packed)) tlv_t;

uint16_t crc16_x25_check(uint8_t* data, uint8_t length);
uint16_t tlv_packet(uint8_t *buffer, uint8_t buf_len, void *value, uint8_t value_len, uint8_t tag);
uint16_t tlv_parse(uint8_t *buffer, uint8_t buf_len, uint8_t *value_len, uint8_t *tag);

#endif
